package com.kang.learn;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @description: 实例学习法
 * @author: User
 * @date: 2021/10/5
 */
public class SynThreeDemo {

    private static int count = 0;

    private static ReentrantLock lock = new ReentrantLock();

    //region 重入锁问题

    /**
     * 首先大家考虑这段代码会死锁吗？ 大家给我个回复，我看看大家的理解的怎么样
     * 好了，有说会死锁的，有说不会，其实这儿是不会死锁的，而且结果就是0.为什么呢？
     *   这个其实是锁的一个嵌套，因为这两把锁都是同一个 线程对象，我们讲共享变量的设计是
     *   当state=0；线程可以抢占到资源 state =1; 如果进去嵌套访问 共享资源，这时 state = 2
     * 如果有多个嵌套 state会一直累加，释放资源的时候， state–，直到所有重入的锁都释放掉 state=0，
     * 那么其他线程才能继续抢占资源，说白了重入锁的设计目的就是为了防止 死锁！
     */
    public static void incr(){
        try {
            lock.lock();
            Thread.sleep(1);
            count++;

            //调用另外一个方法
            decr();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public static void decr(){
        try {
            // 重入锁
            lock.lock();
            count--;
        }catch(Exception e){

        }finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 1000 ; i++) {
            new Thread(()-> SynThreeDemo.incr()).start();
        }
        Thread.sleep(4000);
        System.out.println("result:" + count);
    }
}
